home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Utilities / SmartFilesystem / Sources / SFSformat / sfsformat.c
Encoding:
C/C++ Source or Header  |  1998-06-14  |  2.5 KB  |  96 lines

  1. #include <dos/dos.h>
  2. #include <dos/dosextens.h>
  3. #include <proto/dos.h>
  4. #include <proto/exec.h>
  5.  
  6. #define ACTION_FORMAT_ARGS (15777218)
  7.  
  8. UBYTE string[200];
  9. UBYTE str_casesensitive[]="CASESENSITIVE \n";
  10.  
  11. LONG main() {
  12.   struct RDArgs *readarg;
  13.   UBYTE template[]="DEVICE=DRIVE/A/K,NAME/A/K,CASESENSITIVE/S\n";
  14.  
  15.   struct {char *device;
  16.           char *name;
  17.           ULONG casesensitive;} arglist={NULL};
  18.  
  19.   if((DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",37))!=0) {
  20.     if((readarg=ReadArgs(template,(LONG *)&arglist,0))!=0) {
  21.       struct MsgPort *msgport;
  22.       struct DosList *dl;
  23.       UBYTE *devname=arglist.device;
  24.  
  25.       while(*devname!=0) {
  26.         if(*devname==':') {
  27.           *devname=0;
  28.           break;
  29.         }
  30.         devname++;
  31.       }
  32.  
  33.       dl=LockDosList(LDF_DEVICES|LDF_READ);
  34.       if((dl=FindDosEntry(dl,arglist.device,LDF_DEVICES))!=0) {
  35.         BPTR input;
  36.         LONG errorcode=0;
  37.  
  38.         input=Input();
  39.         msgport=dl->dol_Task;
  40.         UnLockDosList(LDF_DEVICES|LDF_READ);
  41.  
  42.         PutStr("Press RETURN to begin formatting or CTRL-C to abort: ");
  43.         Flush(Output());
  44.  
  45.         if(IsInteractive(input)!=DOSFALSE) {
  46.           for(;;) {
  47.             if((WaitForChar(input,100)==DOSTRUE)) {
  48.               if(errorcode==0 && (errorcode=DoPkt(msgport,ACTION_INHIBIT,DOSTRUE,0,0,0,0))!=DOSFALSE) {
  49.                 UBYTE *src;
  50.                 UBYTE *dest=string;
  51.  
  52.                 *dest=10;
  53.                 *(dest+1)=0;
  54.  
  55.                 if(arglist.casesensitive!=0) {
  56.                   src=str_casesensitive;
  57.  
  58.                   while((*dest++=*src++)!=0) {
  59.                   }
  60.                   dest-=2;
  61.                 }
  62.  
  63.                 if((errorcode=DoPkt(msgport,ACTION_FORMAT_ARGS,(LONG)arglist.name,0x53465300,(LONG)string,0,0))==DOSFALSE) {
  64.                   PrintFault(IoErr(),"error while initializing the drive");
  65.                 }
  66.  
  67.                 DoPkt(msgport,ACTION_INHIBIT,DOSFALSE,0,0,0,0);
  68.               }
  69.               else {
  70.                 PrintFault(IoErr(),"error while locking the drive");
  71.               }
  72.               break;
  73.             }
  74.             else if(SetSignal(0L,SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
  75.               PutStr("\n***Break\n");
  76.               break;
  77.             }
  78.           }
  79.  
  80.           while(WaitForChar(input,0)==DOSTRUE) {
  81.             FGetC(input);
  82.           }
  83.         }
  84.       }
  85.       else {
  86.         VPrintf("Unknown device %s\n",&arglist.device);
  87.         UnLockDosList(LDF_DEVICES|LDF_READ);
  88.       }
  89.  
  90.       FreeArgs(readarg);
  91.     }
  92.     CloseLibrary((struct Library *)DOSBase);
  93.   }
  94.   return(0);
  95. }
  96.